package ComoViajo;
import java.util.ArrayList;
import java.util.HashMap;


/**
 * Comentar las clases aunque sea contar que hacen
 * @comment Sergio
 *
 */
public  class MockModuloExternoMapaDeTransporte implements	ModuloExternoMapaDeTransporte {
	protected static final MockModuloExternoMapaDeTransporte instance = new MockModuloExternoMapaDeTransporte();
	
	private HashMap <String, ArrayList <Direccion>> recorridoDeColectivos= new HashMap <String, ArrayList <Direccion>>();

	private MockModuloExternoMapaDeTransporte(){}
	
	
	
	public static MockModuloExternoMapaDeTransporte getInstance() {
		return MockModuloExternoMapaDeTransporte.instance;
	}
	
	public int getDistancia(Direccion direccionOrigen, Direccion direccioDestino) {
		if(((direccionOrigen.calle.equals("pasaEl99"))&&(direccioDestino.calle.equals("muchosColectivoSubteTren(B)")))||
			(direccionOrigen.calle.equals("muchosColectivoSubteTren(B)"))&&(direccioDestino.calle.equals("pasaEl99")))
				{
			return 15;
		}
		return 0;
	}
	
	public ArrayList<EstacionInterface> getTransportesCercanos(Direccion direccion) {
		ArrayList<EstacionInterface> estacionesCercanas=new ArrayList<EstacionInterface>();
		
		if (direccion==null) return estacionesCercanas;
		
		if((direccion.calle.equals("planes")&&direccion.numero.equals(663))){
			//la direccion de mi casa
			
			// transportes que pasan cerca
			estacionesCercanas.add(new Colectivo("106",direccion));
			estacionesCercanas.add(new Colectivo("99",direccion));
			estacionesCercanas.add(FactoryEstaciones.crearEstacionSubte("angel gallardo", "B", new Direccion("corrientes",4700)));
			estacionesCercanas.add(new Colectivo("36",direccion));
			estacionesCercanas.add(new Colectivo("15",direccion));
			estacionesCercanas.add(new Colectivo("105",direccion));
			estacionesCercanas.add(FactoryEstaciones.crearEstacionSubte("acoyte", "A", new Direccion("rivadavia",5000)));
			estacionesCercanas.add(new Colectivo("146",direccion));
			estacionesCercanas.add(new Colectivo("24",direccion));
			
		}else if((direccion.calle.equals("medrano")&&direccion.numero.equals(951))){
				// la facultad

			// transportes que pasan cerca
			estacionesCercanas.add(new Colectivo("151",direccion));
			estacionesCercanas.add(new Colectivo("7",direccion));
			estacionesCercanas.add(new Colectivo("36",direccion));
			estacionesCercanas.add(FactoryEstaciones.crearEstacionSubte("medrano", "B", new Direccion("corrientes",4000)));
			estacionesCercanas.add(new Colectivo("99",direccion));
			estacionesCercanas.add(new Colectivo("106",direccion));
			
			estacionesCercanas.add(new Colectivo("101",direccion));
		}else if(direccion.calle.equals("unSoloColectivo99")|| direccion.calle.equals("pasaEl99")){
			estacionesCercanas.add(new Colectivo("99",direccion));
		}else if(direccion.calle.equals("dosColectivos105y146")){
			estacionesCercanas.add(new Colectivo("150",direccion));
			estacionesCercanas.add(new Colectivo("146",direccion));
		}else if(direccion.calle.equals("dosColectivos12y99")){
			estacionesCercanas.add(new Colectivo("12",direccion));
			estacionesCercanas.add(new Colectivo("99",direccion));
		}else if(direccion.calle.equals("dosColectivos11y6")){
			estacionesCercanas.add(new Colectivo("11",direccion));
			estacionesCercanas.add(new Colectivo("6",direccion));			
		}else if(direccion.calle.equals("unSoloSubteB")){
			estacionesCercanas.add(FactoryEstaciones.crearEstacionSubte("combinaconUncolectivo99", "B"));
		}else if(direccion.calle.equals("elSubteAbasto")){
			estacionesCercanas.add(FactoryEstaciones.crearEstacionSubte("abasto", "B"));
		}else if(direccion.calle.equals("unSoloTrenSarmiento")){
			estacionesCercanas.add(FactoryEstaciones.crearEstacionTren("3", "sarmiento"));
		}else if(direccion.calle.equals("muchosColectivoSubteTren(A)")){
			estacionesCercanas.add(FactoryEstaciones.crearEstacionSubte("abasto", "B"));
			estacionesCercanas.add(FactoryEstaciones.crearEstacionTren("1", "sarmiento"));
			estacionesCercanas.add(new Colectivo("150",direccion));
			estacionesCercanas.add(new Colectivo("146",direccion));
			estacionesCercanas.add(new Colectivo("99",direccion));
		}else if(direccion.calle.equals("muchosColectivoSubteTren(B)")){
			estacionesCercanas.add(new Colectivo("99",direccion));
			estacionesCercanas.add(new Colectivo("150",direccion));
		
		}
		
		
		return estacionesCercanas;
	}

	/**
	 * 
	 */
	public boolean puedeCombinar(Colectivo colectivo1, Colectivo colectivo2) {
		if((colectivo1.getLinea().equals("106")&&colectivo2.getLinea().equals("99"))||(colectivo1.getLinea().equals("99")&&colectivo2.getLinea().equals("106"))){
			return true;			
		}
		return false;
	}

	public Direccion dondeCombina(Colectivo colectivo1, Colectivo colectivo2) {
		if(!this.puedeCombinar(colectivo1, colectivo2)){
			return null;
		}
		
		if((colectivo1.getLinea().equals("106")&&colectivo2.getLinea().equals("99"))||(colectivo1.getLinea().equals("99")&&colectivo2.getLinea().equals("106"))){
			return new Direccion("cabrera", 984);
		}
		return null;
	}

	public ArrayList <Direccion> getRecorrido (String linea,Direccion origen,Direccion destino){
		return this.recorridoDeColectivos.get(linea);
	}
	public void setRecorridoDeLinea (String linea, ArrayList<Direccion> direcciones){
		this.recorridoDeColectivos.put(linea, direcciones);
	}
	public ArrayList <Direccion> getDireccionesCongestionadas(ArrayList <Direccion> recorrido, ArrayList <Direccion> congestionadas){
		ArrayList <Direccion> recorridoCongestionado = new ArrayList <Direccion>();
		for (Direccion direccion: recorrido)
			if (congestionadas.contains(direccion)){
				recorridoCongestionado.add(direccion);
			}
		return recorridoCongestionado;
	}
}
